package tools

//MaxI return max of l , r
func MaxI(l, r int) int {
	if l > r {
		return l
	}
	return r
}

//MinI return min of l , r
func MinI(l, r int) int {
	if l < r {
		return l
	}
	return r
}

//MaxI64 return max of l , r
func MaxI64(l, r int64) int64 {
	if l > r {
		return l
	}
	return r
}

//MinI64 return min of l , r
func MinI64(l, r int64) int64 {
	if l < r {
		return l
	}
	return r
}

//MaxU64 return max of l , r
func MaxU64(l, r uint64) uint64 {
	if l > r {
		return l
	}
	return r
}

//MinU64 return min of l , r
func MinU64(l, r uint64) uint64 {
	if l < r {
		return l
	}
	return r
}

//Interval 左闭右开区间
type Interval struct {
	Lower int64 //下界
	Upper int64 //上界
}

//Len 区间长度
func (i *Interval) Len() int64 {
	return i.Upper - i.Lower
}

//Contains 区间包含
func (i *Interval) Contains(v int64) bool {
	return v >= i.Lower && v < i.Upper
}

//Cmp 比较， 小于下界-1，包含0，大于上界1
func (i *Interval) Cmp(v int64) int64 {
	l := v - i.Lower
	if l < 0 {
		return l
	}
	u := v - i.Upper
	if u > 0 {
		return u
	}
	return 0
}

//Random 随机数
func (i *Interval) Random() int64 {
	return RandomI64LU(i.Lower, i.Upper)
}
